import java.io.Serializable;

/**
 * 1 单例之饿汉模式
 * 在类加载时就完成了初始化，所以类加载比较慢，但获取对象的速度快，同时无法做到延时加载
 * <p>
 * ①声明静态私有类变量，且立即实例化，保证实例化一次
 * ②私有构造，防止外部实例化（通过反射是可以实例化的，不考虑此种情况）
 * ③提供public的getInstance（）方法供外部获取单例实例
 * 好处：线程安全；获取实例速度快 缺点：类加载即初始化实例，内存浪费
 *
 * @author agstar
 * @date 2019/7/3 10:10
 */
public class Hungry implements Serializable {

    private static final Hungry hungry = new Hungry();

    /**
     * 构造函数私有化
     */
    private Hungry() {
        if (hungry != null) {
            throw new RuntimeException("单例构造器禁止反射!");
        }
    }

    /**
     * 提供一个全局的静态方法
     */
    public static Hungry getInstance() {
        return hungry;
    }

    public Object readResolve() {
        return hungry;
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                Hungry hungry = Hungry.getInstance();
                System.out.println(hungry);
            }).start();
        }
    }

}
